package com.atguigu.tingshu.order.pattern;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.lang.UUID;
import com.atguigu.tingshu.common.constant.RedisConstant;
import com.atguigu.tingshu.order.helper.SignHelper;
import com.atguigu.tingshu.vo.order.OrderInfoVo;
import com.atguigu.tingshu.vo.order.TradeVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;

import java.util.Map;
import java.util.concurrent.TimeUnit;

public abstract class AbstractTradeStrategy implements TradeStrategy{

    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * 获取流水号的方法
     */
    public void generateTradeNo(OrderInfoVo orderInfoVo, Long userId){
        //封装流水号,流水号需要防止用户重复提交
        //构建当前用户当前订单流水号
        //采用uuid生成本次流水号的值
        //并设置过期时间,注意,不能使用setnx,因为这样出问题就需要等待key到期才能释放锁

        String tradeNoKey = RedisConstant.ORDER_TRADE_NO_PREFIX + userId;

        String tradeNo = UUID.randomUUID().toString().replaceAll("-","");

        //将流水号存到redis中
        redisTemplate.opsForValue().set(tradeNoKey,tradeNo,5, TimeUnit.MINUTES);

        //封装流水号
        orderInfoVo.setTradeNo(tradeNo);
    }

    /**
     * 获取签名的方法
     */
    public void generateSign(OrderInfoVo orderInfoVo, Long userId){

        //封装时间戳
        orderInfoVo.setTimestamp(System.currentTimeMillis());
        //签名机制
        //调用生成签名的工具方法,底层就是MD5,对订单VO中所有属性值进行排序,拼接成字符串加密钥,进行MD5加密,返回签名值
        //将订单VO转为map对象,由于无法确定用户选择用什么支付方式,所以需要排出payway

        Map<String, Object> map = BeanUtil.beanToMap(orderInfoVo, false, true);
        //调用生成签名工具方法，底层就是Md5,对订单VO中所有属性值进行排序，拼接成字符串+秘钥，进行MD5加密，返回签名值
        String sign = SignHelper.getSign(map);

        orderInfoVo.setSign(sign);

    }
}
